package br.com.dallasmotopecas.compra.promocao.managerbean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.dallasmotopecas.comum.fabricante.vo.FabricanteVo;
import br.com.dallasmotopecas.comum.produto.controller.ProdutoGiroController;
import br.com.dallasmotopecas.comum.produto.vo.ProdutoGiroDetalheVo;
import br.com.dallasmotopecas.comum.produto.vo.ProdutoGiroVo;
import br.com.dallasmotopecas.comum.promocao.controller.PromocaoController;
import br.com.dallasmotopecas.comum.promocao.controller.PromocaoPremiacaoController;
import br.com.dallasmotopecas.comum.promocao.controller.PromocaoTipoController;
import br.com.dallasmotopecas.comum.promocao.vo.PromocaoPremiacaoVo;
import br.com.dallasmotopecas.comum.promocao.vo.PromocaoTipoVo;
import br.com.dallasmotopecas.comum.promocao.vo.PromocaoVo;
import br.com.dallasmotopecas.util.exception.AlterarObjetoException;
import br.com.dallasmotopecas.util.exception.CampoObrigatorioException;
import br.com.dallasmotopecas.util.exception.ClasseNaoEncontradaException;
import br.com.dallasmotopecas.util.exception.ConexaoException;
import br.com.dallasmotopecas.util.exception.ConsultarObjetoException;
import br.com.dallasmotopecas.util.exception.DeletarObjetoException;
import br.com.dallasmotopecas.util.exception.DirecionamentoPaginaException;
import br.com.dallasmotopecas.util.exception.InserirObjetoException;
import br.com.dallasmotopecas.util.exception.ListarObjetoException;
import br.com.dallasmotopecas.util.managerbean.AbstractManagerBean;

@ManagedBean(name="managerPromocaoProdutoBean")
@ViewScoped
public class ManagerPromocaoProdutoBean extends AbstractManagerBean implements Serializable
{
	private static final long serialVersionUID = 1L;
	private PromocaoVo promocaoVo;
	private Date setarDataValidade;
	private List<PromocaoPremiacaoVo> listaPremiacao;
	private List<PromocaoTipoVo> listaTipoPromocao;
	private List<ProdutoGiroDetalheVo> listaProdutoHum;
	private List<ProdutoGiroDetalheVo> listaProdutoDois;
	private List<ProdutoGiroDetalheVo> listaProduto;
	private List<FabricanteVo> listaFabricantes;
	private FabricanteVo fabricanteVo;
	private ProdutoGiroVo produtoGiroVo;
	private List<PromocaoVo> listaPromocoes;
 	
	public ManagerPromocaoProdutoBean()
	{
		
	}
	
	@PostConstruct
	public void initialize()
	{
		try
		{
			if (!isUsuarioLogado())
			{
				redirecionarPagina("/Index.jsf");
				return;
			}
			processaPermissaoUsuario(getUsuarioLogado());
			carregarDados();
		}
		catch(DirecionamentoPaginaException e)
		{
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
	}
	
	@PreDestroy
	public void destroy()
	{
		setPromocaoVo(null);
		setFabricanteVo(null);
		setProdutoGiroVo(null);
		getListaPremiacao().clear();
		setListaPremiacao(null);
		getListaTipoPromocao().clear();
		setListaTipoPromocao(null);
		getListaProdutoHum().clear();
		setListaProdutoHum(null);
		getListaProdutoDois().clear();
		setListaProdutoDois(null);
		getListaProduto().clear();
		setListaProduto(null);
		getListaFabricantes().clear();
		setListaFabricantes(null);
		getListaPromocoes().clear();
		setListaPromocoes(null);
	}

	public PromocaoVo getPromocaoVo()
	{
		if (promocaoVo == null) promocaoVo = new PromocaoVo();
		
		return promocaoVo;
	}

	public void setPromocaoVo(PromocaoVo promocaoVo)
	{
		this.promocaoVo = promocaoVo;
	}
	
	public Date getSetarDataValidade()
	{
		if (setarDataValidade == null) setarDataValidade = new Date();
		
		return setarDataValidade;
	}

	public void setSetarDataValidade(Date setarDataValidade)
	{
		this.setarDataValidade = setarDataValidade;
	}

	public List<PromocaoPremiacaoVo> getListaPremiacao()
	{
		if (listaPremiacao == null) listaPremiacao = new ArrayList<PromocaoPremiacaoVo>();
		
		return listaPremiacao;
	}

	public void setListaPremiacao(List<PromocaoPremiacaoVo> listaPremiacao)
	{
		this.listaPremiacao = listaPremiacao;
	}

	public List<PromocaoTipoVo> getListaTipoPromocao()
	{
		if (listaTipoPromocao == null) listaTipoPromocao = new ArrayList<PromocaoTipoVo>();
		
		return listaTipoPromocao;
	}

	public void setListaTipoPromocao(List<PromocaoTipoVo> listaTipoPromocao)
	{
		this.listaTipoPromocao = listaTipoPromocao;
	}
	
	public List<FabricanteVo> getListaFabricantes()
	{
		if (listaFabricantes == null) listaFabricantes = new ArrayList<FabricanteVo>();
		
		return listaFabricantes;
	}

	public void setListaFabricantes(List<FabricanteVo> listaFabricantes)
	{
		this.listaFabricantes = listaFabricantes;
	}
	
	public FabricanteVo getFabricanteVo()
	{
		if (fabricanteVo == null) fabricanteVo = new FabricanteVo();
		
		return fabricanteVo;
	}

	public void setFabricanteVo(FabricanteVo fabricanteVo)
	{
		this.fabricanteVo = fabricanteVo;
	}

	public List<ProdutoGiroDetalheVo> getListaProdutoHum()
	{
		if (listaProdutoHum == null) listaProdutoHum = new ArrayList<ProdutoGiroDetalheVo>();
		
		return listaProdutoHum;
	}

	public void setListaProdutoHum(List<ProdutoGiroDetalheVo> listaProdutoHum)
	{
		this.listaProdutoHum = listaProdutoHum;
	}

	public List<ProdutoGiroDetalheVo> getListaProdutoDois()
	{
		if (listaProdutoDois == null) listaProdutoDois = new ArrayList<ProdutoGiroDetalheVo>();
		
		return listaProdutoDois;
	}

	public void setListaProdutoDois(List<ProdutoGiroDetalheVo> listaProdutoDois)
	{
		this.listaProdutoDois = listaProdutoDois;
	}

	public List<ProdutoGiroDetalheVo> getListaProduto()
	{
		if (listaProduto == null) listaProduto =  new ArrayList<ProdutoGiroDetalheVo>();
		
		return listaProduto;
	}

	public void setListaProduto(List<ProdutoGiroDetalheVo> listaProduto)
	{
		this.listaProduto = listaProduto;
	}

	public ProdutoGiroVo getProdutoGiroVo()
	{
		if (produtoGiroVo == null) produtoGiroVo = new ProdutoGiroVo();
		
		return produtoGiroVo;
	}

	public void setProdutoGiroVo(ProdutoGiroVo produtoGiroVo)
	{
		this.produtoGiroVo = produtoGiroVo;
	}

	public List<PromocaoVo> getListaPromocoes()
	{
		if (listaPromocoes == null) listaPromocoes =  new ArrayList<PromocaoVo>();
		
		return listaPromocoes;
	}

	public void setListaPromocoes(List<PromocaoVo> listaPromocoes)
	{
		this.listaPromocoes = listaPromocoes;
	}

	public void carregarDados()
	{
		PromocaoPremiacaoController promocaoPremiacaoController = null;
		PromocaoTipoController promocaoTipoController = null;
		PromocaoController promocaoController = null;
		try
		{
			limparDados();
			
			promocaoPremiacaoController = new PromocaoPremiacaoController(getContexto());
			promocaoTipoController = new PromocaoTipoController(getContexto());
			promocaoController = new PromocaoController(getContexto());
			
			promocaoPremiacaoController.carregarListaPremiacao(getListaPremiacao());
			promocaoTipoController.carregarListaTipo(getListaTipoPromocao());
			promocaoController.carregarListaPromocoes(getListaPromocoes());
		}
		catch(ListarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (promocaoPremiacaoController != null)
			{
				promocaoPremiacaoController.close();
				promocaoPremiacaoController = null;
			}
			
			if (promocaoTipoController != null)
			{
				promocaoTipoController.close();
				promocaoTipoController = null;
			}
			
			if (promocaoController != null)
			{
				promocaoController.close();
				promocaoController = null;
			}
		}
	}

	public void novaPromocao()
	{
		ProdutoGiroController produtoGiroController = null;
		HashSet<FabricanteVo> listaFabricante = null;
		try
		{
			setProdutoGiroVo(new ProdutoGiroVo());
			getProdutoGiroVo().setTipoGiro("S");
			setPromocaoVo(new PromocaoVo());
			setSetarDataValidade(new Date());
			produtoGiroController = new ProdutoGiroController(getContexto());
			produtoGiroController.consultarUltimoGiro(getProdutoGiroVo());
			
			getListaProdutoHum().clear();
			getListaProdutoDois().clear();
			getListaProduto().addAll(getProdutoGiroVo().getListaProdutosGiro());
			getListaFabricantes().clear();
			
			listaFabricante = new HashSet<FabricanteVo>();
			
			for (int i = 0; i < getListaProduto().size(); i++)
				listaFabricante.add(getListaProduto().get(i).getFabricanteVo());
			
			getListaFabricantes().addAll(listaFabricante);
			Collections.sort(getListaFabricantes());
			getListaFabricantes().add(0, new FabricanteVo(0, 0, "Todos"));
			
			abrirModal("produtosPromocaoDialog");
		}
		catch(ListarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConsultarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (produtoGiroController != null)
			{
				produtoGiroController.close();
				produtoGiroController = null;
			}
			listaFabricante = null;
		}		
	}
	
	public void alterarPromocao(PromocaoVo promocaoVo)
	{
		ProdutoGiroController produtoGiroController = null;
		ProdutoGiroVo produtoGiroVo = null;
		HashSet<FabricanteVo> listaFabricante = null;
		try
		{
			setPromocaoVo(promocaoVo);
			setSetarDataValidade(promocaoVo.getDataValidade());
			produtoGiroVo = new ProdutoGiroVo();
			produtoGiroVo.setId(promocaoVo.getProdutoGiroVo().getId());
			produtoGiroVo.setTipoGiro(promocaoVo.getProdutoGiroVo().getTipoGiro());
			produtoGiroController = new ProdutoGiroController(getContexto());
			produtoGiroController.consultarGiro(produtoGiroVo);
			getListaProdutoHum().clear();
			getListaProdutoDois().clear();
			getListaFabricantes().clear();
			getListaProduto().clear();
			getListaProduto().addAll(produtoGiroVo.getListaProdutosGiro());
			
			listaFabricante = new HashSet<FabricanteVo>();
			
			for (int i = 0; i < getListaProduto().size(); i++)
				listaFabricante.add(getListaProduto().get(i).getFabricanteVo());
			
			getListaFabricantes().addAll(listaFabricante);
			Collections.sort(getListaFabricantes());
			getListaFabricantes().add(0, new FabricanteVo(0, 0, "Todos"));
			
			for (int i = 0; i < promocaoVo.getListaProdutosPromocao().size(); i++)
			{
				for (int j = 0; j < getListaProduto().size(); j++)
				{
					if (promocaoVo.getListaProdutosPromocao().get(i).getProdutoGiroDetalheVo().getId() == getListaProduto().get(j).getId())
					{
						getListaProdutoDois().add(promocaoVo.getListaProdutosPromocao().get(i).getProdutoGiroDetalheVo());
						getListaProduto().remove(promocaoVo.getListaProdutosPromocao().get(i).getProdutoGiroDetalheVo());
					}
				}
			}
			abrirModal("produtosPromocaoDialog");
		}
		catch(ListarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConsultarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (produtoGiroController != null)
			{
				produtoGiroController.close();
				produtoGiroController = null;
			}
			produtoGiroVo = null;
			listaFabricante = null;
		}
	}
	
	public void inserirProdutoPromocao(ProdutoGiroDetalheVo produtoGiroDetalheVo)
	{
		getListaProdutoDois().add(produtoGiroDetalheVo);
		getListaProduto().remove(produtoGiroDetalheVo);
		getListaProdutoHum().remove(produtoGiroDetalheVo);
	}
	
	public void removerProdutoPromocao(ProdutoGiroDetalheVo produtoGiroDetalheVo)
	{
		getListaProdutoDois().remove(produtoGiroDetalheVo);
		getListaProduto().add(produtoGiroDetalheVo);
		getListaProdutoHum().add(produtoGiroDetalheVo);
	}
	
	public void inserirTodosProdutoPromocao()
	{
		getListaProdutoDois().addAll(getListaProdutoHum());
		getListaProduto().removeAll(getListaProdutoHum());
		getListaProdutoHum().clear();
	}
	
	public void removerTodosProdutoPromocao()
	{
		getListaProduto().addAll(getListaProdutoDois());
		getListaProdutoDois().clear();
		getListaProdutoHum().clear();
	}
	
	public void carregarProdutoFabricante()
	{
		getListaProdutoHum().clear();
		
		if (getFabricanteVo().getId() == 0)
			getListaProdutoHum().addAll(getListaProduto());
		else
		{
			for (int i = 0; i < getListaProduto().size(); i++)
			{
				if (getListaProduto().get(i).getFabricanteVo().getId() == getFabricanteVo().getId())
					getListaProdutoHum().add(getListaProduto().get(i));
			}
		}
		Collections.sort(getListaProdutoHum());
	}
	
	public void gravar()
	{
		PromocaoController promocaoController = null;
		try
		{
			promocaoController = new PromocaoController(getContexto());
			getPromocaoVo().setDataValidade(new java.sql.Date(getSetarDataValidade().getTime()));
			if (getPromocaoVo().getId() == 0)
			{
				getPromocaoVo().getProdutoGiroVo().setId(getProdutoGiroVo().getId());
				getPromocaoVo().getUsuarioVo().setId(getUsuarioLogado().getId());
				promocaoController.inserirPromocao(getPromocaoVo(), getListaProdutoDois());
			}
			else
				promocaoController.alterarPromocao(getPromocaoVo(), getListaProdutoDois());
			
			carregarDados();
			fecharModal("produtosPromocaoDialog");
		}
		catch(InserirObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (CampoObrigatorioException e)
		{
			processarMensagem(MENSAGEM_INFORMATIVA, e.getMessage());
		}
		catch (AlterarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (DeletarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (promocaoController != null)
			{
				promocaoController.close();
				promocaoController = null;
			}
		}
	}
	
	private void limparDados()
	{
		setPromocaoVo(new PromocaoVo());
		setSetarDataValidade(new Date());
		setProdutoGiroVo(new ProdutoGiroVo());
		setFabricanteVo(new FabricanteVo());
		getListaPremiacao().clear();
		getListaTipoPromocao().clear();
		getListaProdutoHum().clear();
		getListaProdutoDois().clear();
		getListaProduto().clear();
		getListaPromocoes().clear();
	}
	
	public void sair()
	{
		try
		{
			redirecionarPagina("/view/compra/Home.jsf");
		}
		catch (DirecionamentoPaginaException e)
		{
			e.printStackTrace();
		}
	}
}
